package com.kexio.dynamic.config.annotation;

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

/**
 * 配置刷新作用域注解
 * 
 * 标记在类或方法上，当相关配置发生变化时，
 * 会重新初始化Bean或重新执行方法
 * 
 * 使用示例：
 * <pre>
 * &#64;Component
 * &#64;RefreshScope
 * public class DatabaseConfig {
 *     &#64;DynamicValue(key = "db.url")
 *     private String dbUrl;
 * }
 * 
 * &#64;RefreshScope(configs = {"app.cache.*"})
 * &#64;Bean
 * public CacheManager cacheManager() {
 *     return new CacheManager();
 * }
 * </pre>
 * 
 * @author Kexio
 * @since 1.0.0
 */
@Target({ElementType.TYPE, ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
public @interface RefreshScope {

    /**
     * 监听的配置键模式
     * 支持通配符匹配，如: app.*, db.connection.*
     * 为空时监听类中所有@DynamicValue注解的配置
     */
    String[] configs() default {};

    /**
     * 刷新策略
     * immediate: 立即刷新
     * delayed: 延迟刷新
     * batch: 批量刷新
     */
    RefreshStrategy strategy() default RefreshStrategy.IMMEDIATE;

    /**
     * 刷新延迟时间（毫秒）
     * 仅在delayed策略下生效
     */
    long delay() default 1000;

    /**
     * 是否异步刷新
     */
    boolean async() default false;

    /**
     * 刷新失败时的处理策略
     */
    FailureStrategy onFailure() default FailureStrategy.LOG_AND_CONTINUE;

    /**
     * 刷新策略枚举
     */
    enum RefreshStrategy {
        /**
         * 立即刷新
         */
        IMMEDIATE,
        
        /**
         * 延迟刷新
         */
        DELAYED,
        
        /**
         * 批量刷新
         */
        BATCH
    }

    /**
     * 失败处理策略枚举
     */
    enum FailureStrategy {
        /**
         * 记录日志并继续
         */
        LOG_AND_CONTINUE,
        
        /**
         * 抛出异常
         */
        THROW_EXCEPTION,
        
        /**
         * 忽略失败
         */
        IGNORE
    }
}
